﻿#define _CRT_SECURE_NO_WARNINGS 1
/*题目描述
一个矩阵An×m,矩阵按行依次为1∼nm。若干种指令，指令集如下： (以3×3的初始矩阵为例，结果矩阵列中为初始矩阵执行这条指令后的矩阵结果)

指令	含义	指令示例	结果矩阵
IN n m	初始化为n×m的矩阵	IN 3 3	1 2 3
4 5 6
7 8 9
SR x y	交换矩阵的x,y行	SR 1 2	4 5 6
1 2 3
7 8 9
SC x y	交换矩阵的x,y列	SC 1 2	2 1 3
5 4 6
8 7 9
TR	矩阵转置	TR	1 4 7
2 5 8
3 6 9
FR	上下镜像反转	FR	7 8 9
4 5 6
1 2 3
FC	左右镜像反转	FC	3 2 1
6 5 4
9 8 7
PR	输出矩阵	PR	1 2 3
4 5 6
7 8 9
现在给你一个合法的指令序列（条数不超过1000，矩阵行列最大不超过10），请执行对应指令。

输入
每行输入一条指令。

输出
对于每个PR命令，输出矩阵。矩阵元素之间有一个空格，行末无空格，最后输出一个空行。*/
#include<stdio.h>
#include<string.h>

int arr[16][16];
char ming[1006][6];
int p = 0;
int n[1006], m[1006];

void swap(int* a, int* b)
{
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;

}

void Init()
{
    int j, i, o = 1;
    for (j = 1; j <= n[0]; j++)
    {
        for (i = 1; i <= m[0]; i++)
        {
            arr[j][i] = o;
            o++;
        }
    }
}

void SR()
{
    int i = 0;
    int x = n[p];
    int y = m[p];
    for (i = 1; i <= m[0]; i++)
    {
        swap(&arr[x][i], &arr[y][i]);
    }
}

void SC()
{
    int i = 0;
    int x = n[p];
    int y = m[p];
    for (i = 1; i <= n[0]; i++)
    {
        swap(&arr[i][x], &arr[i][y]);
    }
}

void TR()
{
    swap(&n[0], &m[0]);
    int j, i;
    int brr[16][16];
    for (j = 1; j <= n[0]; j++)
    {
        for (i = 1; i <= m[0]; i++)
        {
            brr[j][i] = arr[i][j];
        }
    }

    for (j = 1; j <= n[0]; j++)
    {
        for (i = 1; i <= m[0]; i++)
        {
            arr[j][i] = brr[j][i];
        }
    }
}

void print()
{
    int i, j;
    for (j = 1; j <= n[0]; j++)
    {
        for (i = 1; i <= m[0]; i++)
        {
            printf("%d", arr[j][i]);
            if (i != m[0])
                printf(" ");
        }
        printf("\n");
    }
    printf("\n");
}

void FR()
{
    int i, j;
    int x = n[0];
    int y = m[0];
    for (j = 1; j <= (x / 2); j++)
    {
        for (i = 1; i <= y; i++)
        {
            swap(&arr[j][i], &arr[x + 1 - j][i]);
        }
    }

}

void FC()
{
    int i, j;
    int x = n[0];
    int y = m[0];
    for (j = 1; j <= x; j++)
    {
        for (i = 1; i <= (y / 2); i++)
        {
            swap(&arr[j][i], &arr[j][y + 1 - i]);
        }
    }

}


int main()
{
    int i = 0, j = 0;
    while (scanf("%s", ming[p]) != EOF)
    {
        if (ming[p][0] == 'I')
        {
            p = 0;
            scanf("%d%d", &n[p], &m[p]);
            Init();
        }
        else if (ming[p][0] == 'S' && ming[p][1] == 'R')
        {
            scanf("%d%d", &n[p], &m[p]);
            SR();
        }
        else if (ming[p][0] == 'S' && ming[p][1] == 'C')
        {
            scanf("%d%d", &n[p], &m[p]);
            SC();
        }
        else if (ming[p][0] == 'T' && ming[p][1] == 'R')
        {
            TR();
        }
        else if (ming[p][0] == 'F' && ming[p][1] == 'R')
        {
            FR();
        }
        else if (ming[p][0] == 'F' && ming[p][1] == 'C')
        {
            FC();
        }
        else if (ming[p][0] == 'P' && ming[p][1] == 'R')
        {
            print();
        }
        p++;
    }
    return 0;
}